package com.njbw.trace;

import org.slf4j.MDC;

import java.util.UUID;

/**
 * 取决于 trace id 的上下文
 * 怎么放 trace id？怎么拿到 trace id
 */
public class TraceIdContext {

    // 为了在子线程中使用，要 new 一个 InheritableThreadLocal，线程中可传递
    public static final ThreadLocal<String> CURRENT_TRACE_ID = new InheritableThreadLocal<>();

    public static String generateTraceId() {
        // 基于雪花的 id，此处就直接用 UUID
        return UUID.randomUUID().toString();
    }

    public static String getTraceId() {
        return MDC.get(TraceIdConstant.TRACE_ID); // 可以从 MDC 中拿到我们的 trace id
    }

    public static void setTraceId(String traceId) {
        MDC.put(TraceIdConstant.TRACE_ID, traceId);
    }

    public static void removeTraceId() {
        MDC.remove(TraceIdConstant.TRACE_ID);
    }

    public static void clearTraceId() {
        removeTraceId();
        CURRENT_TRACE_ID.remove();
    }
}
